import json
import os
from pathlib import Path

# 新增内存缓存变量（全局）
STATS_CACHE = []
STATS_FILE = Path(__file__).parent / 'stats.json'


def _load_cache():
    """初始化或刷新内存缓存（仅在必要时调用）"""
    global STATS_CACHE
    try:
        with open(STATS_FILE, 'r', encoding='utf-8') as f:
            STATS_CACHE = json.load(f)
    except (FileNotFoundError, json.JSONDecodeError):
        STATS_CACHE = []  # 文件不存在或解析失败时初始化为空列表


def _save_cache():
    """将内存缓存写回文件（仅在数据变更时调用）"""
    with open(STATS_FILE, 'w', encoding='utf-8') as f:
        json.dump(STATS_CACHE, f, ensure_ascii=False)


# 新增去重函数
def remove_duplicates():
    global STATS_CACHE
    unique_entries = []
    seen = set()
    for entry in STATS_CACHE:
        # 使用元组来表示唯一标识
        entry_tuple = (entry['questionId'], entry.get('isCorrect', False))
        if entry_tuple not in seen:
            seen.add(entry_tuple)
            unique_entries.append(entry)
    STATS_CACHE = unique_entries
    _save_cache()

# 模块加载时初始化缓存（首次运行时加载一次）
_load_cache()
# 模块加载时调用去重函数
remove_duplicates()


def calculate_stats():
    # 直接使用内存缓存
    total = len(STATS_CACHE)
    # 修改判断条件，将 isCorrect=false 且 errorCount>0 的都当作错误题目
    incorrect = sum(1 for r in STATS_CACHE if (not r.get('isCorrect', False)) or r.get('errorCount', 0) > 0)
    correct = total - incorrect

    accuracy = "{0:.2f}".format(correct / total * 100) if total > 0 else '0.00'
    error_rate = "{0:.2f}".format(incorrect / total * 100) if total > 0 else '0.00'

    return {
        'accuracy': accuracy,
        'errorRate': error_rate
    }


def handle_get_stats(self):
    # 直接使用内存缓存计算
    total = len(STATS_CACHE)
    # 修改判断条件，将 isCorrect=false 且 errorCount>0 的都当作错误题目
    incorrect = sum(1 for item in STATS_CACHE if (not item.get('isCorrect', False)) or item.get('errorCount', 0) > 0)
    correct = total - incorrect

    # Python中使用字符串格式化替代toFixed
    accuracy = "{0:.2f}".format(correct / total * 100) if total > 0 else '0.00'
    error_rate = "{0:.2f}".format(incorrect / total * 100) if total > 0 else '0.00'

    # 返回JSON响应
    self.send_response(200)
    self.send_header('Content-type', 'application/json')
    self.end_headers()
    self.wfile.write(json.dumps({
        "accuracy": accuracy,
        "errorRate": error_rate
    }).encode('utf-8'))


def handle_save_stats(self):
    # 读取请求数据
    content_length = int(self.headers['Content-Length'])
    post_data = self.rfile.read(content_length)
    new_entry = json.loads(post_data)  # 新的答题记录

    # 检查是否已经存在相同的 questionId
    existing_entry = next((entry for entry in STATS_CACHE if entry['questionId'] == new_entry['questionId']), None)
    if existing_entry:
        # 如果存在且本次回答错误，则递增错误次数
        if not new_entry.get('isCorrect', False):
            existing_entry['errorCount'] = existing_entry.get('errorCount', 0) + 1
    else:
        # 初始化错误次数（假设只有错误时才会调用此接口）
        new_entry['errorCount'] = 1 if not new_entry.get('isCorrect', False) else 0
        STATS_CACHE.append(new_entry)
    
    _save_cache()
    self.send_response(200)
    self.end_headers()

def handle_get_wrong_questions(self):
    # 修改判断条件，生成带错误次数的题号列表
    wrong_questions = [
        (record['questionId'], record.get('errorCount', 0))
        for record in STATS_CACHE 
        if (not record.get('isCorrect', False)) or record.get('errorCount', 0) > 0
    ]
    
    # 按错误次数降序排序（使用元组中的第二个元素）
    wrong_questions.sort(key=lambda x: x[1], reverse=True)
    
    # 仅返回题号列表
    self.send_response(200)
    self.send_header('Content-type', 'application/json')
    self.end_headers()
    self.wfile.write(json.dumps([item[0] for item in wrong_questions]).encode('utf-8'))


def handle_reset_stats(self):
    # 直接清空内存缓存
    STATS_CACHE.clear()
    # 写回空文件（仅一次写操作）
    _save_cache()
    self.send_response(200)
    self.end_headers()

def handle_get_last_question(handler):
    try:
        if not STATS_CACHE:
            # 如果没有答题记录，返回错误信息
            response_data = {
                "question_url": None,
                "message": "暂无答题记录"
            }
        else:
            # 获取最后一个答题记录
            last_record = STATS_CACHE[-1]
            last_question_id = last_record['questionId']
            # 假设题目 URL 格式为 /question/{questionId}
            last_question_url = f"/question/{last_question_id}"
            
            response_data = {
                "question_url": last_question_url
            }
        
        handler.send_response(200)
        handler.send_header('Content-type', 'application/json')
        handler.end_headers()
        handler.wfile.write(json.dumps(response_data).encode('utf-8'))
    except Exception as e:
        handler.send_error(500, f"内部服务器错误: {str(e)}")